package com.jdk.study.d2jvm.chapter02;

/**
 * @description: 类的加载过程  ----- 第三阶段：initialization【初始化】
 * @author: JackLi
 * @date: 2020/4/10 22:34
 */
public class ClassLoader03_ClassInitTest {

    /*

        知识点：
        1、类初始化过程
            一个类要创建实例需要先加载并初始化该类
                ~ main方法所在的类需要先加载和初始化

            一个子类要初始化需要先初始化父类

            一个类初始化就是执行<clinit>()方法
                ~ <clinit>()方法由静态类变量显示赋值代码和静态代码块组成
                ~ 静态类变量显示赋值代码和静态代码块代码从上到下顺序执行
                ~ <clinit>()方法只执行一次


        2、实例初始化过程
            实例初始化就是执行<init>()方法
                ~ <init>()方法可能重载有多个，有几个构造器就有几个<init>方法
                ~ <init>()方法由非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成
                ~ 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行，而对应构造器的代码最后执行
                ~ 每次创建实例对象，调用对应构造器，执行的就是对应的<init>方法
                ~ <init>方法的首行是super()或super(实参列表)，即对应父类的<init>方法

     */

    private static int num = 1;

    static {
        num = 2;
        number = 20;
//        System.out.println(number); 报错，非法的前项引用
    }

    // 执行操作：linking 之 Prepare：number = 0  -->  initialization： 先赋值 20 之后再赋值10
    private static int number = 10;

    public static void main(String[] args) {
        System.out.println(ClassLoader03_ClassInitTest.num);  // 2
        System.out.println(ClassLoader03_ClassInitTest.number);   // 10
    }

}
